package com.ssy.lingxi.common.language;

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 国际化语言全局MessageSource
 * @author 万宁
 * @version 2.0.0
 * @date 2022-02-14
 */
@Component
public class LanguageHolder {
    public static MessageSource messageSource;

    @Resource
    public MessageSource injectMessageSource;

    @PostConstruct
    public void init() {
        messageSource = injectMessageSource;
    }

    /**
     * 根据当前语言，从配置文件中查询对应的语言
     * @param key        配置文件的Key
     * @return 语言对应的枚举状态
     */
    public static String getName(String key) {
        return getName(key, getDefaulValue());
    }

    /**
     * 根据当前语言，从配置文件中查询对应的语言
     * @param key            配置文件的Key
     * @param defaultMessage 默认值
     * @return 语言对应的枚举状态
     */
    public static String getName(String key, String defaultMessage) {
        try {
            return messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
        } catch (Exception ignored) {
            return defaultMessage == null ? getDefaulValue() : defaultMessage;
        }
    }

    /**
     * 根据当前语言，从配置文件中查询对应的语言
     * @param enumClass 枚举类型Class
     * @param code      枚举值
     * @return 语言对应的枚举状态
     */
    public static String getName(Class<?> enumClass, Integer code) {
        return getName(enumClass, code, getDefaulValue());
    }

    /**
     * 根据当前语言，从配置文件中查询对应的语言
     * @param enumClass 枚举类型Class
     * @param code      枚举值
     * @param defaultMessage 默认值
     * @return 语言对应的枚举状态
     */
    public static String getName(Class<?> enumClass, Integer code, String defaultMessage) {
        if(code == null) {
            return defaultMessage;
        }

        String key = enumClass.getSimpleName().concat(".").concat(String.valueOf(code));
        try {
            return messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
        } catch (Exception ignored) {
            return getDefaulValue();
        }
    }

    /**
     * 根据当前语言，当配置文件中不存在对应的Key时，返回默认值
     * @return 默认值
     */
    private static String getDefaulValue() {
        try {
            String language = LocaleContextHolder.getLocale().getLanguage().toLowerCase();
            switch (language) {
                case "en":
                    return "unknown";
                case "ko":
                    return "알려지지 않은";
                default:
                    return "未知";
            }
        } catch (Exception ignored) {
            return "未知";
        }
    }
}
